package cn.tedu.justone.pack01;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * ZZ：JustOne
 * VX：Andylau2020smile
 * DY：JustOne2018
 * ZT：《》
 */
public class Demo03_方法示例_tryLock {

    //常用方法三：boolean b = tryLock();
    // 1,tryLock()用来尝试获取锁，如果当前锁没有被其他线程占用，则获取成功返回true，
    //   否则获取锁失败返回false。
    // 2,这样的设计显得更加灵活，在拿不到锁的情况下也不会一直等待。经常与if 配合使用，
    //   例如 if(myLock.tryLock()) {...};根据是否获取到锁来执行不同的业务逻辑。
    // 3,执行完后可以看出，既保证了"核心任务"的线程安全，又顺带完成了几项"其他任务"。

    public static void main(String[] args) {
        Table02 table = new Table02();

        new Thread("男生"){
            @Override
            public void run() {
                while(table.mi>0){
                    table.foo();
                }
            }
        }.start();

        new Thread("女生"){
            @Override
            public void run() {
                while(table.mi>0){
                    table.foo();
                }
            }
        }.start();
    }
}

class Table02{
    static int mi = 10;
    Lock myLock = new ReentrantLock();
    public void foo(){
        if(myLock.tryLock()){
            try{
                if(mi>0){
                    String name = Thread.currentThread().getName();
                    System.out.println("获得了锁正在执行核心任务是" + name);
                    mi--;
                    mySleep(10);//故意占用久一点
                }
            }finally {
                myLock.unlock();//释放锁
            }
        }else{
            String name = Thread.currentThread().getName();
            System.out.println("------没有获得锁，在执行别的任务的" + name);
            mySleep(10);//
        }
    }

    //为了让代码更优雅，编写统一的休眠方法
    public static void mySleep(long m){
        try {
            Thread.sleep(m);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}
